package demo05;

public class Mise implements Runnable {
    private Manjyuu m; // 锁
    private double saifu; // 钱包

    public Mise(Manjyuu m, double saifu) {
        this.m = m;
        this.saifu = saifu;
    }

    @Override
    public void run() {
        /*
         *  先设置包子的品种，价格，以及起始库存
         */
        Manjyuu m1 = new Manjyuu("韭菜鸡蛋包", 3.0, 3);
        Manjyuu m2 = new Manjyuu("猪肉大葱包", 6.0, 3);
        Manjyuu m3 = new Manjyuu("照烧鸡腿包", 7.0, 3);
        Manjyuu m4 = new Manjyuu("奶黄包", 2.0, 3);

        while (m.getCount() >= 0) { // 无限循环卖包子，有两个退出循环方式：1.客人要的包子名没有 2.客人钱不够
            /*
             *  价目表打印
             */
            System.out.println("==========================================================");
            System.out.println("欢迎光临~~~土仔包子铺价目表：");
            System.out.println(m1.getName() + "~" + m1.getMoney() + "￥\t" + m2.getName() + "~" + m2.getMoney() + "￥");
            System.out.println(m3.getName() + "~" + m3.getMoney() + "￥\t" + m4.getName() + "~" + m4.getMoney() + "￥");
            synchronized (m) { // 加锁，老板线程先执行
                try {
                    m.wait(); // 等待客人线程说出想要的包子
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Manjyuu m0 = m; // 锁变量m不能直接被替换值，由临时变量m0接收客人想要的包子
                /*
                 *  通过客人想要的包子名，找到包子的属性信息（名字、价格、库存），然后存放到m0中便于管理
                 */
                if (m0.getName().equals(m1.getName())) {
                    m0 = m1;
                } else if (m0.getName().equals(m2.getName())) {
                    m0 = m2;
                } else if (m0.getName().equals(m3.getName())) {
                    m0 = m3;
                } else if (m0.getName().equals(m4.getName())) {
                    m0 = m4;
                }
                if (m0.getMoney() == 0.0) { // m0没有价格信息，代表没有这个品种的包子，结束循环
                    System.out.println("不好意思，本店不卖" + m.getName());
                    m.setCount(-2); // 没有该包子，m的库存信息设置标记-2，提示客人换家店看看
                    m.notify(); // 唤醒客人离开包子铺
                } else if (saifu < m0.getMoney()) { // 钱包的钱小于m0包子的价格，代表钱不够，结束循环
                    System.out.println("您钱不够，请下次再来~");
                    m.setCount(-1); // 客人没有钱，m的库存信息设置标记-1，提示客人回家
                    m.notify(); // 唤醒客人离开包子铺
                } else {
                    /*
                     *  判断包子是否有库存
                     *  如果有库存，直接卖给客人一个
                     *  如果无库存，花5s制作新的一屉（3个），加到库存中，并卖给客人一个
                     */
                    if (m0.getCount() == 0) { // 包子无库存
                        System.out.println("好的，" + m0.getName() + "5s后做好给您，请稍等...");
                        try {
                            Thread.sleep(5000); // 5s制作一屉包子
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        m0.setCount(m0.getCount() + 3); // 制作完成后库存+3
                        System.out.println(m0.getName() + "新的一屉出锅了~~~");
                        System.out.println(m0.getName() + "做好了，收您" + m0.getMoney() + "￥");
                        m0.setCount(m0.getCount() - 1); // 包子给客人，库存-1
                    } else { // 包子有库存
                        System.out.println("好的，" + m0.getName() + "已做好，收您" + m0.getMoney() + "￥");
                        m0.setCount(m0.getCount() - 1); // 包子给客人，库存-1
                    }
                    saifu -= m0.getMoney(); // 钱包变量扣除相应包子的钱
                    m.notify(); // 唤醒客人线程吃包子
                }
            }
            try { // 老板线程给完包子后晚跑0.05s，防止撞线程
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
